#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "err.hpp"
#include "log.hpp"

void daemon()
{
    // 1.忽略信号:常见的异常信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);
    //2.让自己不要成为组长
    if(fork() > 0) exit(0);
    //3.新建会话，自己成为会话的首进程
    pid_t s = setsid();
    //4.可选：可以更改守护进程的工作路径
    //5.处理后续的对于0，1，2问题
    //为了确保守护进程不会再次获得控制终端，我们可以关闭其标准输入、输出和错误描述符，并重新指定它们到 /dev/null。
    int fd = open("/dev/null",O_RDWR);
    if(fd < 0)
    {
        logMessage(Fatal,"code:%d,open error:%s",errno,strerror(errno));
        exit(OPEN_ERROR);
    }
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);
}